/**
 * 用户角色关联实体类
 * 
 * 功能说明：
 * - 实现用户与角色的多对多关联关系
 * - 一个用户可以有多个角色，一个角色可以分配给多个用户
 * - 通过中间表实现，支持灵活的权限分配
 * 
 * 数据库设计：
 * - 表名：user_roles（用户角色关联表）
 * - 主键：继承自BaseEntity的id字段
 * - 外键约束：
 *   - user_id：引用users表的id，级联删除
 *   - role_id：引用roles表的id，级联删除
 * - 唯一约束：通常需要在(user_id, role_id)上创建联合唯一索引，防止重复分配
 * 
 * 关联关系：
 * - @ManyToOne：多对一关联，多个用户角色关联对应一个用户/角色
 * - FetchType.LAZY：延迟加载，提高查询性能，只在需要时加载关联对象
 * - nullable = false：确保关联关系必须存在，不允许null值
 * 
 * 使用场景：
 * - 用户权限分配：为用户分配角色时创建关联记录
 * - 权限验证：查询用户拥有的角色列表，进行权限判断
 * - 角色管理：查看某个角色被分配给了哪些用户
 * 
 * @author eCommerce Team
 * @version 1.0
 */
package com.ecommerce.auth.entity;

import com.ecommerce.common.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 用户角色关联实体类
 * 实现用户与角色的多对多关联关系
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "user_roles")
public class UserRole extends BaseEntity {

    /**
     * 关联的用户对象
     * - 多对一关联：多个用户角色关联对应一个用户
     * - 延迟加载：只在需要时加载用户详细信息，提高性能
     * - 外键约束：user_id，非空，确保关联关系存在
     * - 级联操作：通常配置为级联删除，删除用户时同时删除关联记录
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    /**
     * 关联的角色对象
     * - 多对一关联：多个用户角色关联对应一个角色
     * - 延迟加载：只在需要时加载角色详细信息，提高性能
     * - 外键约束：role_id，非空，确保关联关系存在
     * - 级联操作：通常配置为级联删除，删除角色时同时删除关联记录
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "role_id", nullable = false)
    private Role role;
}